/****************************************************************************************
*            . .. .                                                                     *
*                    ...                                                                *
*                       .":                                                             *
*   .                      u                                                            *
* ..     .:uxkkOkkx=.      "k'                                                          *
*.     "k00O0ko==uk00x'     OO.                       IBE-CAE                           *
*'   .xK0O00: 'xx" x0Ku    .O0:     Copyright (C) by Internet Based Engineering         *
*   .O0OO00= oKOk:"O0O'    :00=                 All rights reserved.                    *
*.  =0OOO00" =OOO0Oo'     =0OO:                      www.ibe.cn                         *
*.  u0OOOO0O'          .o00OOO.                                                         *
* . :KOOOOO00xu=:::=uok00OOOO"                                                          *
*   .x00OOOOOO0000000OOOOOOx.                                                           *
*    .u00OOOOOOOOOOOOOOOOO=                                                             *
*      .ukOOOOOOOOOOOOku'                                                               *
*          .'::==::'.                                                                   *
****************************************************************************************/

#ifndef IBE_BLOCKS_H_
#define IBE_BLOCKS_H_

#include <string>
#include <vector>

#include "IBE_Object.h"

namespace ibe_common
{
    class IBE_Block;

    /**
    * @class IBE_Blocks
    * @brief 存储所有网格集信息
    * @author liupeng
    */
    class IBE_COMMON_EXPORT IBE_Blocks : public IBE_Object
    {
    public:
        explicit IBE_Blocks();
        ~IBE_Blocks();

        IBE_TypeMacro( ibe_common, IBE_Blocks, ibe_common, IBE_Object );

        //@{
        /**
         * @brief 设置/获取版本信息
         *
         * @param ver 版本信息，默认2.0
         * @return 版本信息
         */
        virtual void SetVersion( const char* ver );
        virtual const char* GetVersion()
        {
            return this->version_.c_str();
        }
        //@}

        /**
         * @brief 网格集类型
         */
        enum IBE_MeshSetType
        {
            IBE_MESHSET_PART,       //!< part
            IBE_MESHSET_SET,        //!< set
            IBE_MESHSET_SURFACE,    //!< surface
            IBE_MESHSET_NODE,       //!< node
            IBE_MESHSET_ELEMENT     //!< element
        };
        virtual std::string GetMeshSetTypeString( const int &meshSetType );

        //@{
        /**
         * @brief 添加网格集信息
         *
         * @param meshSetType 网格集集合类型，IBE_Blocks::IBE_MeshSetType枚举值
         * @param block 网格集信息
         * @return 在对应网格集集合中的索引，-1表示添加失败
         */
        virtual int AddBlock( const int meshSetType, IBE_Block* block );
        virtual int AddBlockToPart( IBE_Block* block );
        virtual int AddBlockToSet( IBE_Block* block );
        virtual int AddBlockToSurface( IBE_Block* block );
        virtual int AddBlockToNode( IBE_Block* block );
        virtual int AddBlockToElement( IBE_Block* block );
        /**
         * @brief 移除网格集信息（没有delete内容）
         *
         * @param meshSetType 网格集集合类型，IBE_Blocks::IBE_MeshSetType枚举值
         * @param index 在对应网格集集合中的索引
         * @param block 网格集信息
         * @return 0-失败，1-成功
         */
        virtual int RemoveBlock( const int meshSetType, const int index );
        virtual int RemoveBlock( const int meshSetType, IBE_Block* block );
        virtual int RemoveBlock( IBE_Block* block );
        /**
         * @brief 移除网格集信息（会delete内容）
         *
         * @param meshSetType 网格集集合类型，IBE_Blocks::IBE_MeshSetType枚举值
         * @param index 在对应网格集集合中的索引
         * @param block 网格集信息
         * @return 0-失败，1-成功
         */
        virtual int DeleteBlock( const int meshSetType, const int index );
        virtual int DeleteBlock( const int meshSetType, IBE_Block* block );
        virtual int DeleteBlock( IBE_Block* block );
        /**
         * @brief 获取指定网格集集合中，网格集的数量
         *
         * @param meshSetType 网格集集合类型，IBE_Blocks::IBE_MeshSetType枚举值
         * @return 网格集数量
         */
        virtual int GetNumberOfBlocks( const int meshSetType );
        /**
         * @brief 获取指定网格集
         *
         * @param meshSetType 网格集集合类型，IBE_Blocks::IBE_MeshSetType枚举值
         * @param index 索引
         * @return 网格集
         */
        virtual IBE_Block* GetBlock( const int meshSetType, const int index );
        /**
         * @brief 获取指定网格集在对应网格集集合的索引
         *
         * @param meshSetType 网格集集合类型，IBE_Blocks::IBE_MeshSetType枚举值
         * @param block 网格集信息
         * @return 索引
         */
        virtual int GetBlockIndex( const int meshSetType, IBE_Block* block );
        //@}

        virtual void Initialize() override;
        /**
         * @brief 清空所有网格集（不会delete内容）
         */
        virtual void ClearAllBlocks();
        /**
        * @brief 清空所有网格集（会delete内容）
        */
        virtual void DeleteAllBlocks();

        virtual void Copy( ibe_common::IBE_Object* obj ) override;

    protected:
        virtual void DeleteBlocks( std::vector<IBE_Block*> &blocks );
        virtual std::vector<IBE_Block*>* GetBlocksByType( int meshSetType );

    protected:
        std::string version_; //!< 版本信息，默认“2.0”

        //! Part网格集合
        std::vector<IBE_Block*> partBlocks_;
        //! Set网格集合
        std::vector<IBE_Block*> setBlocks_;
        //! Surface网格集合
        std::vector<IBE_Block*> surfaceBlocks_;
        //! Node网格集合
        std::vector<IBE_Block*> nodeBlocks_;
        //! Element网格集合
        std::vector<IBE_Block*> elementBlocks_;
    private:
        IBE_Blocks( const IBE_Blocks& ) = delete;
        IBE_Blocks& operator=( const IBE_Blocks& ) = delete;
    };
} // namespace ibe_common

#endif // IBE_BLOCKS_H_